package computerArchitecture;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

/**
 * @author ChangLiang
 * @date 2021/4/14
 */
public class CpuCacheTest {

    @Test
    @DisplayName("test")
    public void test(){
        int[] arr = new int[64 * 1024 * 1024];

        long start = System.currentTimeMillis();
        for (int i = 0; i < arr.length; i++) {
            arr[i] *= 3;
        }
        long end = System.currentTimeMillis();
        System.out.println("Time spent is " + (end - start) + "ms");

        start = System.currentTimeMillis();
        // 在循环 2 里，我们每隔 16 个索引访问一个数组元素，将这一项的值变成了原来的 3 倍。

        // 按道理来说，循环 2 只访问循环 1 中 1/16 的数组元素，
        // 只进行了循环 1 中 1/16 的乘法计算，
        // 那循环 2 花费的时间应该是循环 1 的 1/16 左右。

        // 但是实际上，循环 1 在我的电脑上运行需要 50 毫秒，
        // 循环 2 只需要 46 毫秒。这两个循环花费时间之差在 15% 之内。
        for (int i = 0; i < arr.length; i+=16) {
            arr[i] *= 3;
        }
        end = System.currentTimeMillis();
        System.out.println("Time spent is " + (end - start) + "ms");
    }
}
